# Maintainer: Mitch Tishmack <mitch.tishmack@gmail.com>
pkgname=ghc
pkgver=9.0.1
pkgrel=1
# Normal non rc candidate
_urlprefix="$pkgver"
_pkgprefix="$pkgname-$pkgver"
_llvmver=12
pkgdesc="The Glasgow Haskell Compiler"
# Next 5 variables only needed for release candidate testing
#pkgrcver=8.2.2
#pkgrc=rc3
#pkgdate=20171108
#urlprefix="$pkgrcver-$pkgrc"
#pkgprefix="ghc-$pkgver.$pkgdate"
url="https://haskell.org/"
arch="x86_64"
# Note ghc's license is basically BSD-3. If you'd like to know more visit:
# * https://www.haskell.org/ghc/license
# * https://ghc.haskell.org/trac/ghc/wiki/Licensing
license="BSD-3-Clause"
# Note that ghc is sensitive to the version of llvm used.
#
# Ref: https://ghc.haskell.org/trac/ghc/wiki/Status/GHC-8.0.1
#      https://ghc.haskell.org/trac/ghc/wiki/ImprovedLLVMBackend
depends="gmp-dev perl gcc>=6.2.1 llvm$_llvmver"
# ghc is self-hosted, so we need ghc to build ghc. ghc-bootstrap is provided by
# this aport (see below).
makedepends_build="$pkgname-bootstrap
	autoconf binutils binutils-gold libffi-dev ncurses-dev xz coreutils grep"
makedepends_host="linux-headers musl-dev zlib-dev gmp-dev binutils-dev
	libffi-dev ncurses-dev"
makedepends="$makedepends_build $makedepends_host"
checkdepends="python3"
# XXX: ghc-bootstrap is a hack to allow this abuild to depend on itself.
# Adding "ghc" to makedepends would not work, because abuild implicitly removes
# $pkgname and $subpackages from the abuild's dependencies.
provides="$pkgname-bootstrap=$pkgver-r$pkgrel"
subpackages="$pkgname-doc $pkgname-dev"
install="$pkgname.post-install"
ldpath="/usr/lib/ghc-$pkgver"
options="!strip ldpath-recursive"  # we strip it manually in build()
source="https://downloads.haskell.org/~ghc/$_urlprefix/$_pkgprefix-src.tar.xz
	https://downloads.haskell.org/~ghc/$_urlprefix/$_pkgprefix-testsuite.tar.xz

	0001-Replace-more-autotools-obsolete-macros-19189.patch
	0002-configure-fix-the-use-of-some-obsolete-macros-19189.patch
	0003-llvmGen-Accept-range-of-LLVM-versions.patch
	0004-Fix-autoconf-after-6d6edb1bbb.patch
	0005-Set-min-LLVM-version-to-9-and-make-version-checking-.patch
	0006-Optimiser-Correctly-deal-with-strings-starting-with-unicode.patch

	0005-buildpath-abi-stability.patch
	0001-testsuite-unset-MAKEFLAGS-when-calling-python.patch
	0001-testsuite-T12600-avoid-broken-pipe-on-Alpine.patch
	skip-tests.patch
	tests-use-iterable-from-collections-abc.patch
	"

prepare() {
	default_prepare

	cp mk/build.mk.sample mk/build.mk

	cat >> mk/build.mk <<-EOF
		BuildFlavour         = perf-llvm
	EOF

	if [ "$CBUILD" != "$CTARGET" ]; then
		# cross-build
		cat >> mk/build.mk <<-EOF
			BuildFlavour         = perf-cross
			HADDOCK_DOCS         = NO
			BUILD_SPHINX_HTML    = NO
			BUILD_SPHINX_PS      = NO
			BUILD_SPHINX_PDF     = NO
		EOF
	fi

	# Due to patches to the configure script
	autoreconf -fi
}

build() {
	# NOTE: ghc build system requires host == build, and it ends up
	# compiling the cross-compiler (stage1) and cross-compiling with
	# that the native compiler (stage2)
	./configure \
		--build=$CBUILD \
		--host=$CBUILD \
		--target=$CTARGET \
		--prefix=/usr \
		--with-system-libffi \
		--disable-ld-override

	# Switch llvm-targets from unknown-linux-gnueabihf->alpine-linux
	# so we can match the llvm vendor string alpine uses
	sed -i -e 's/unknown-linux-gnueabihf/alpine-linux/g' llvm-targets
	sed -i -e 's/unknown-linux-gnueabi/alpine-linux/g' llvm-targets
	sed -i -e 's/unknown-linux-gnu/alpine-linux/g' llvm-targets

	make
}

check() {
	make fasttest SKIP_PERF_TESTS=YES THREADS=${JOBS:-$(nproc)}
}

doc() {
	default_doc
	install -Dm644 "$builddir/LICENSE" \
		"$subpkgdir/usr/share/licenses/$subpkgname/LICENSE"
}

package() {
	local ghclib="usr/lib/ghc-$pkgver"
	local newpath path target

	make DESTDIR="$pkgdir" install

	cd "$pkgdir"

	# Fixup install tree if needed.
	if [ -d usr/lib/$CTARGET-ghc-$pkgver ]; then
		# different location
		ghclib="usr/lib/$CTARGET-ghc-$pkgver"

		# Rename binaries and fix links.
		local path; for path in usr/bin/"$CTARGET"-*; do
			newpath="${path//$CTARGET-/}"

			if [ -h "$path" ]; then
				target="$(readlink $path)"
				ln -sf "${target//$CTARGET-/}" "$newpath"
				rm "$path"
			else
				mv "$path" "$newpath"
			fi
		done

		# Remove triplet prefix from settings -- the intention is
		# that the native compiler will use native gcc/ld on the target.
		sed -i "s|$CTARGET-||g" usr/lib/$CTARGET-ghc-$pkgver/settings
	fi

	# Can't do a full strip on archives.
	find . -type f \( -name "*.so" -o -name "*.a" \) \
		-exec ${CROSS_COMPILE}strip --strip-unneeded {} \;
	find $ghclib/bin -type f -exec ${CROSS_COMPILE}strip {} \;
}

# Like debian, we split apart the profiled archives/etc...
# This drastically reduces the install size of the ghc pkg.
dev() {
	pkgdesc="$pkgdesc (development files)"
	depends="$pkgname=$pkgver-r$pkgrel"

	cd "$pkgdir"

	install -dm755 "$subpkgdir"

	amove $(find . \( -type f -o -type l \) \( -name "*.p_*" -o -name "lib*_p.a" \))
}

sha512sums="
bee7950a5118be8d8cefe0db5070139a5a93ca21c5bc6f8bf453429831f0c44f5e0fb5ee569865d6b8b92749044ee4123be06920928ac7a1ec9cffa9404a3e53  ghc-9.0.1-src.tar.xz
13fbe0f0ab5e2426820d0fb37f0a75e1198ef2a660398508806e8ef094fd23647ca3d386815a2118168d12253d8df3273043678dbb37cf3924c689dd0fd1932e  ghc-9.0.1-testsuite.tar.xz
6390cb76b7786efb89acc854fdf68766c149412dddbf8c5f399aa90e204e704d6e476e6d850361d66e8e821e1a69dc55cb6b3b883dcd02e9ec5c6f5288ee280b  0001-Replace-more-autotools-obsolete-macros-19189.patch
c1a4906f4a0a3abf5b2ed03a3d24c6ab097910f3fab5486c443dfc87ffbba399f95218663421ebf7e43d6d066ff0b364931d9bc3e5aa2162684f8b8511bc7531  0002-configure-fix-the-use-of-some-obsolete-macros-19189.patch
cb90cf9c3af2704acb15e9c18b1b7d6b1de32bc4014c3d631e3d34bdf07ef91b03869b0ae3721ab73acb9f7dbd2e2805462e10c9c5431ed17464dd274121228a  0003-llvmGen-Accept-range-of-LLVM-versions.patch
775ef373ed60f752138d5ff728c2205b7d18ec72d8cf86152f6473a154003d0c9379d82310aeca2211123bfe48f6a5414af00d50a26680638b6db9718160199e  0004-Fix-autoconf-after-6d6edb1bbb.patch
b3aeaf4c4f9e816350b97f1060cb2de3f9dcacd2c10c714cceb5e50d47ad94e845c2dae63eea22d806437c307ab6f561bfb385ec98087465c4172e22d755f402  0005-Set-min-LLVM-version-to-9-and-make-version-checking-.patch
8523a5fef22e391c668e315d115792c90de072e817f7a171e0c94e360684536e5c75eabe8a02ca73029431fb32462096bbdf6b8210dc862f72a79e28ec0ca27a  0006-Optimiser-Correctly-deal-with-strings-starting-with-unicode.patch
4133c70bb46b7aba9b8eba87cdbd58d802584e5e8ffb01450c80bb4607e6e90a45a437ea142aa8a8cb199dc6f46e769437c3c47769976093490de71161a3943d  0005-buildpath-abi-stability.patch
ac2ad793b4d33ea890e236820af4cd10996b47d0f4249c825b31450145cb8195c2be62f2d7942cc3bf564f768dca187379196b251f4b37ed326ed2a0a5f59e8a  0001-testsuite-unset-MAKEFLAGS-when-calling-python.patch
b71bb7945c6cae3ea324ff1de9576b883f0e63169fbe50d781acc0f4fb694387c43bf7aa1bd1cca236613ff202dd503c4577dc06368614752affdc54a5c62101  0001-testsuite-T12600-avoid-broken-pipe-on-Alpine.patch
253dab8d9eea886b085c8136b313bb753997a1fed0fcdea15848ccaa51a3a2230298df858a893f996054f27e9add2259bf1938e3afd07c8a50d84b9152c095be  skip-tests.patch
c3bc4f872d3903c4446167df1a88ec54cdd712c4b0ea0b0c35487e9b7e5bd7124da0688d1d5fbf26cad932e841f0299ada304e2300c25e01ffe3de10b74e78c1  tests-use-iterable-from-collections-abc.patch
"
